package es.uc3m.setichat.db;

import java.util.ArrayList;
import java.util.Iterator;

import es.uc3m.setichat.format.Contacto;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.util.Log;

public class SaveDataContacts extends SQLiteOpenHelper {
	 
	/** Version base de datos*/
	private static final int DBVERSION = 1;
	/**Nombre de la base de datos*/
	public static final String DBNAME= "DBSeTIChat1.db";
	/** Nombre de la tabla que almacena los datos de los contactos*/
	public static final String TABLE_CONTACTS = "contactsData";
	/** NOmbre de la columna que almacena los mensajes*/
	public static final String TABLE_MESSAGES = "messagesData";
	
	/** Constructor creacion base de datos*/
	public SaveDataContacts(Context context, String name,
			CursorFactory factory, int version){
		super(context, DBNAME, null, DBVERSION);
	}
	
	/** Creacion de la base de datos
	 *  @param database
	 *  */
	public void onCreate(SQLiteDatabase database){
		
		String USER_TABLE = "CREATE TABLE usuario (mobile TEXT  PRIMARY KEY NOT NULL, nick TEXT NOT NULL, token TEXT, key TEXT)"; 
		String CONTACT_TABLE = "CREATE TABLE contactos (mobile TEXT PRIMARY KEY NOT NULL, nick TEXT NOT NULL, key TEXT)";
		String MESSAGE_TABLE = "CREATE TABLE mensajes (id INTEGER PRIMARY KEY AUTOINCREMENT  NOT NULL, mobile TEXT NOT NULL, fecha TEXT NOT NULL, mensaje TEXT, recibido INTEGER NOT NULL)";
		database.execSQL(CONTACT_TABLE);
		database.execSQL(MESSAGE_TABLE);
		database.execSQL(USER_TABLE);
		Log.d("SaveDataContacts", "Tablas creadas en la base de datos "+ DBNAME);
	}
	/** Actualizacion de la base de datos
	 *  @param database
	 *  @param oldVersion
	 *  @param newVersion
	 * */
	public void onUpgrade(SQLiteDatabase database, int oldVersion, int newVersion){
		
		database.execSQL("DROP TABLE IF EXISTS contactos");
		database.execSQL("DROP TABLE IF EXISTS mensajes");
		database.execSQL("DROP TABLE IF EXISTS usuario");
		/*Creacion de las tablas con la version nueva*/
        this.onCreate(database);
		
	}
	
	/**
	 * Devuelve todos los contactos
	 * @return listaContactos*/
    public ArrayList<Contacto> getAllContacts() {
        
    	ArrayList<Contacto> listaContactos = new ArrayList<Contacto>();
 
        /*Consulta*/
        String query = "SELECT  * FROM " + TABLE_CONTACTS;
 
       /*Referenciar a la base de datos*/
        SQLiteDatabase database = this.getWritableDatabase();
        Cursor cursor = database.rawQuery(query, null);
 
        /*Recorrer cada fila y almacenarlo en la base de datos*/
        Contacto contacto = null;
        if (cursor.moveToFirst()) {
            do {
                contacto = new Contacto();
                contacto.setMobile(cursor.getString(0));
                contacto.setNick(cursor.getString(1));
 
                // Add book to books
                listaContactos.add(contacto);
            } while (cursor.moveToNext());
        }
 
        Log.d("getAllContacts()", "Se obtienen todos los contactos de la base de datos");
 
        // return books
        return listaContactos;
    }
    
    public void addContacts(ArrayList<Contacto> listaContactos){
    	
    	 SQLiteDatabase database = this.getWritableDatabase();
    	// 2. create ContentValues to add key "column"/value
         ContentValues values = new ContentValues();
    	 Iterator<Contacto> i = listaContactos.iterator();
    	 int contador=0;
         while( i.hasNext() ){
        	 Contacto auxiliar = new Contacto();
        	 auxiliar= listaContactos.get(contador);
        	 values.put("mobile", auxiliar.getMobile());
        	 values.put("nick", auxiliar.getNick());
        	 database.insert(TABLE_CONTACTS, null, values);
        	 contador++;
         }
         database.close(); 
    }
    
    public static String selectPublicKey(Context servicio,String mobile){
    	String clavePublica="";
    	SaveDataContacts dbClavePublica = new SaveDataContacts(servicio,SaveDataContacts.DBNAME,null,1);
		SQLiteDatabase dataBaseClavePublica = dbClavePublica.getReadableDatabase();
		
		Cursor cur = dataBaseClavePublica.rawQuery("SELECT key FROM contactos WHERE mobile='"+mobile+"'", null);
		if (cur.moveToFirst()){
			if(cur.getString(0)!=null && !cur.getString(0).equals("null")){
				clavePublica = cur.getString(0);
			}
		}			
		cur.close();
		dataBaseClavePublica.close();
		return clavePublica;
    }
    
    public static String selectPrivateKey(Context servicio,String token){
    	String clavePrivada ="";
	    SaveDataContacts dbClavePrivada = new SaveDataContacts(servicio,SaveDataContacts.DBNAME,null,1);
		SQLiteDatabase dataBaseClavePrivada = dbClavePrivada.getReadableDatabase();
		
		Cursor c = dataBaseClavePrivada.rawQuery("SELECT key FROM usuario WHERE token='"+token+"'", null);
		if (c.moveToFirst()){
			if(c.getString(0)!=null && !c.getString(0).equals("null")){
				clavePrivada = c.getString(0);
	
			}
		}			
		c.close();
		dataBaseClavePrivada.close();
		return clavePrivada;
    }
    
    public static String selectToken(Context servicio){
    	String tokenDb="";
    	SaveDataContacts dbToken = new SaveDataContacts(servicio,SaveDataContacts.DBNAME,null,1);
		SQLiteDatabase dataBaseToken = dbToken.getReadableDatabase();
		
		if(dataBaseToken!=null){			
			Cursor cursor= dataBaseToken.rawQuery("SELECT token FROM usuario", null);
			if(cursor.getCount()>0){
				while(cursor.moveToNext()){
						tokenDb= cursor.getString(cursor.getColumnIndex("token"));
				}
			}
			cursor.close();
			dataBaseToken.close();
		}
		return tokenDb;
    }
}
